<?php

	require_once('../utils.php');
	require_once('../ORMUsuario.php');
	require_once('../Excel.php');

	session_start();

	switch ($_REQUEST['op'])
	{
		// -------------------------------------------------------
		case 'agregar':
			if (!$_SESSION['autenticado']) reterr (E_ERROR_PROC, 'Se requiere autenticación previa.');
			if ($_SESSION['u']['tipo'] != 1) reterr (E_ERROR_PROC, 'Acceso denegado: Debe ser usuario administrativo.');

			$in = validar ($_REQUEST, array
			(
				'usuario' => array(
					'obligatorio' => array(true, 'Por favor escriba su nombre de usuario.'),
					'pattern' => array('[A-Za-z0-9_.-]+', 'Solo debe tener numeros, letras, guion bajo y guion.')
				),

				'password' => array(
					'obligatorio' => array(true, 'Por favor escriba su contraseña.'),
					'min_longitud' => array (5, 'Por lo mínimo debe tener cinco (5) carácteres.')
				),

				'tipo' => array(
					'obligatorio' => array(true, 'Por favor seleccione el tipo de usuario.'),
					'numerico' => array('Se esperaba un valor numérico'),
					'pertenece' => array (array(1, 2), 'Tipo de usuario no es correcto')
				)
			));

			$i = ORMUsuario::getUsuarioPorNombre ($in['usuario']);
			if ($i['id'] != null) reterr (E_ERROR_PROC, 'Nombre de usuario seleccionado ya existe.');

			$u = new Usuario(NULL, $in['usuario'], sha1($in['password'].$CONFIG['salt']), $in['tipo']);
			$u->guardar();

			break;

		// -------------------------------------------------------
		case 'eliminar':
			if (!$_SESSION['autenticado']) reterr (E_ERROR_PROC, 'Se requiere autenticación previa.');
			if ($_SESSION['u']['tipo'] != 1) reterr (E_ERROR_PROC, 'Acceso denegado: Debe ser usuario administrativo.');

			$in = validar ($_REQUEST, array
			(
				'id' => array(
					'obligatorio' => array(true, 'Se requiere el ID de usuario.'),
					'numerico' => array('Se esperaba un valor numérico')
				)
			));

			$u = new Usuario ($in['id']);
			$u->cargar();

			if ($u->getId() == null) reterr (E_ERROR_PROC, 'Usuario con el ID especificado no existe.');

			$u->eliminar();
			break;

		// -------------------------------------------------------
		case 'contar':
			if (!$_SESSION['autenticado']) reterr (E_ERROR_PROC, 'Se requiere autenticación previa.');
			if ($_SESSION['u']['tipo'] != 1) reterr (E_ERROR_PROC, 'Acceso denegado: Debe ser usuario administrativo.');

			resp('total', ORMUsuario::contarUsuarios());
			break;

		// -------------------------------------------------------
		case 'listar':
			if (!$_SESSION['autenticado']) reterr (E_ERROR_PROC, 'Se requiere autenticación previa.');
			if ($_SESSION['u']['tipo'] != 1) reterr (E_ERROR_PROC, 'Acceso denegado: Debe ser usuario administrativo.');

			$in = validar ($_REQUEST, array
			(
				'offset' => array(
					'obligatorio' => array(true, 'Se requiere el offset a mostrar.'),
					'numerico' => array('Se esperaba un valor numérico')
				),

				'count' => array(
					'obligatorio' => array(true, 'Se requiere el numero de elementos a mostrar.'),
					'numerico' => array('Se esperaba un valor numérico')
				)
			));

			resp('datos', ORMUsuario::getUsuarios($in['offset'], $in['count']));
			break;

		// -------------------------------------------------------
		case 'exportar':
			if (!$_SESSION['autenticado']) reterr (E_ERROR_PROC, 'Se requiere autenticación previa.');
			if ($_SESSION['u']['tipo'] != 1) reterr (E_ERROR_PROC, 'Acceso denegado: Debe ser usuario administrativo.');

			$in = validar ($_REQUEST, array
			(
				'offset' => array(
					'obligatorio' => array(true, 'Se requiere el offset a mostrar.'),
					'numerico' => array('Se esperaba un valor numérico')
				),

				'count' => array(
					'obligatorio' => array(true, 'Se requiere el numero de elementos a mostrar.'),
					'numerico' => array('Se esperaba un valor numérico')
				),

				'full' => array(
					'obligatorio' => array(true, 'Falta parámetro full.'),
					'numerico' => array('Se esperaba un valor numérico')
				)
			));

			if ($in['full'])
			{
				$in['offset'] = 0;
				$in['count'] = $CONFIG['max_export'];
			}

			$data = ORMUsuario::getUsuarios($in['offset'], $in['count']);

			$fields = array('id', 'usuario', 'tipo');
			$header = array('ID', 'Nombre de Usuario', 'Tipo de Usuario');
			$output = array();

			for ($i = 0; $i < sizeof($data); $i++)
			{
				$row = array();

				for ($j = 0; $j < sizeof($fields); $j++)
				{
					$row[] = $data[$i][$fields[$j]];
				}

				$output[] = $row;
			}

			Excel::Exportar('Reporte de Usuarios', $header, $output);
			exit;

			break;

		// -------------------------------------------------------
		case 'detalles':
			if (!$_SESSION['autenticado']) reterr (E_ERROR_PROC, 'Se requiere autenticación previa.');

			resp('datos', array(array(
				'id' => $_SESSION['u']['id'],
				'tipo' => $_SESSION['u']['tipo'],
				'usuario' => $_SESSION['u']['usuario'])
			));

			break;

		// -------------------------------------------------------
		case 'actualizar':
			if (!$_SESSION['autenticado']) reterr (E_ERROR_PROC, 'Se requiere autenticación previa.');
			if ($_SESSION['u']['tipo'] != 1) reterr (E_ERROR_PROC, 'Acceso denegado: Debe ser usuario administrativo.');

			$in = validar ($_REQUEST, array
			(
				'id' => array(
					'obligatorio' => array(true, 'Se requiere el ID de usuario.'),
					'numerico' => array('Se esperaba un valor numérico')
				),

				'usuario' => array(
					'obligatorio' => array(false, 'Por favor escriba su nombre de usuario.'),
					'pattern' => array('[A-Za-z0-9_.-]+', 'Solo debe tener numeros, letras, guion bajo y guion.')
				),

				'password' => array(
					'obligatorio' => array(false, 'Por favor escriba su contraseña.'),
					'min_longitud' => array (5, 'Por lo mínimo debe tener cinco (5) carácteres.')
				),
				
				'tipo' => array(
					'obligatorio' => array(false, 'Por favor escriba su contraseña.'),
					'numerico' => array('Se esperaba un valor numérico'),
					'pertenece' => array (array(1, 2), 'Tipo de usuario no es correcto')
				)
			));

			$u = new Usuario ($in['id']);
			$u->cargar();

			if ($u->getId() == null) reterr (E_ERROR_PROC, 'Usuario con el ID especificado no existe.');

			if ($in['usuario'])
			{
				$i = ORMUsuario::getUsuarioPorNombre ($in['usuario']);
				if ($i['id'] != null && $i['id'] != $u->getId()) reterr (E_ERROR_PROC, 'Nombre de usuario seleccionado ya existe.');

				$u->setUsuario ($in['usuario']);
			}

			if ($in['password'])
				$u->setPassword (sha1($in['password'].$CONFIG['salt']));

			if ($in['tipo'])
				$u->setTipoUsuario ($in['tipo']);

			$u->guardar();
			break;

		// -------------------------------------------------------
		case 'login':
			$in = validar ($_REQUEST, array
			(
				'usuario' => array(
					'obligatorio' => array(true, 'Por favor escriba su nombre de usuario.'),
					'pattern' => array('[A-Za-z0-9_.-]+', 'Solo debe tener numeros, letras, guion bajo y guion.')
				),

				'password' => array(
					'obligatorio' => array(true, 'Por favor escriba su contraseña.'),
					'min_longitud' => array (5, 'Por lo mínimo debe tener cinco (5) carácteres.')
				)
			));

			sleep(1);

			if (ORMUsuario::validarUsuario ($in['usuario'], sha1($in['password'].$CONFIG['salt'])) == -1)
				reterr (E_ERROR_PROC, 'Nombre de usuario o contraseña incorrecta.');

			$_SESSION['autenticado'] = true;
			$_SESSION['u'] = ORMUsuario::getUsuarioPorNombre($in['usuario']);

			break;

		// -------------------------------------------------------
		case 'logout':
			if (!$_SESSION['autenticado']) reterr (E_ERROR_PROC, 'Se requiere autenticación previa.');

			session_destroy();
			break;

		// -------------------------------------------------------
		default:
			if (!$_REQUEST['op'])
				reterr (E_ERROR_PROC, 'Falta código de operación (op).');	
			else
				reterr (E_ERROR_PROC, 'Código de operación no reconocido: ' . $_REQUEST['op']);	

			break;
	}

	ret(E_OK);
